// noinspection JSUnresolvedReference
/**
* Field Google Map
*/
/* global jQuery, document, redux_change, redux, google */
(function ( $ ) {
'use strict';
redux.field_objects = redux.field_objects || {};
redux.field_objects.google_maps = redux.field_objects.google_maps || {};
/* LIBRARY INIT */
redux.field_objects.google_maps.init = function ( selector ) {
if ( ! selector ) {
selector = $( document ).find( '.redux-group-tab:visible' ).find( '.redux-container-google_maps:visible' );
}
$( selector ).each(
function ( i ) {
let delayRender;
const el = $( this );
let parent = el;
if ( ! el.hasClass( 'redux-field-container' ) ) {
parent = el.parents( '.redux-field-container:first' );
}
if ( parent.is( ':hidden' ) ) {
return;
}
if ( parent.hasClass( 'redux-field-init' ) ) {
parent.removeClass( 'redux-field-init' );
} else {
return;
}
// Check for delay render, which is useful for calling a map
// render after JavaScript load.
delayRender = Boolean( el.find( '.redux_framework_google_maps' ).data( 'delay-render' ) );
// API Key button.
redux.field_objects.google_maps.clickHandler( el );
// Init our maps.
redux.field_objects.google_maps.initMap( el, i, delayRender );
}
);
};
/* INIT MAP FUNCTION */
redux.field_objects.google_maps.initMap = async function ( el, idx, delayRender ) {
let delayed;
let scrollWheel;
let streetView;
let mapType;
let address;
let defLat;
let defLong;
let defaultZoom;
let mapOptions;
let geocoder;
let g_autoComplete;
let g_LatLng;
let g_map;
let noLatLng = false;
// Pull the map class.
const mapClass = el.find( '.redux_framework_google_maps' );
const containerID = mapClass.attr( 'id' );
const autocomplete = containerID + '_autocomplete';
const canvas = containerID + '_map_canvas';
const canvasId = $( '#' + canvas );
const latitude = containerID + '_latitude';
const longitude = containerID + '_longitude';
// Add map index to data attr.
// Why, say we want to use delay_render,
// and want to init the map later on.
// You'd need the index number in the
// event of multiple map instances.
// This allows one to retrieve it
// later.
$( mapClass ).attr( 'data-idx', idx );
if ( true === delayRender ) {
return;
}
// Map has been rendered, no need to process again.
if ( $( '#' + containerID ).hasClass( 'rendered' ) ) {
return;
}
// If a map is set to delay render and has been initiated
// from another scrip, add the 'render' class so rendering
// does not occur.
// It messes things up.
delayed = Boolean( mapClass.data( 'delay-render' ) );
if ( true === delayed ) {
mapClass.addClass( 'rendered' );
}
// Create the autocomplete object, restricting the search
// to geographical location types.
g_autoComplete = await google.maps.importLibrary( 'places' );
g_autoComplete = new google.maps.places.Autocomplete( document.getElementById( autocomplete ), {types: ['geocode']} );
// Data bindings.
scrollWheel = Boolean( mapClass.data( 'scroll-wheel' ) );
streetView = Boolean( mapClass.data( 'street-view' ) );
mapType = Boolean( mapClass.data( 'map-type' ) );
address = mapClass.data( 'address' );
address = decodeURIComponent( address );
address = address.trim();
// Set default Lat/lng.
defLat = canvasId.data( 'default-lat' );
defLong = canvasId.data( 'default-long' );
defaultZoom = canvasId.data( 'default-zoom' );
// Eval whether to set maps based on lat/lng or address.
if ( '' !== address ) {
if ( '' === defLat || '' === defLong ) {
noLatLng = true;
}
} else {
noLatLng = false;
}
// Can't have empty values, or the map API will complain.
// Set default for the middle of the United States.
defLat = defLat ? defLat : 39.11676722061108;
defLong = defLong ? defLong : -100.47761000000003;
if ( noLatLng ) {
// If displaying a map based on an address.
geocoder = new google.maps.Geocoder();
// Set up Geocode and pass address.
geocoder.geocode(
{'address': address},
function ( results, status ) {
let latitude;
let longitude;
// Function results.
if ( status === google.maps.GeocoderStatus.OK ) {
// A good address was passed.
g_LatLng = results[0].geometry.location;
// Set map options.
mapOptions = {
center: g_LatLng,
zoom: defaultZoom,
streetViewControl: streetView,
mapTypeControl: mapType,
scrollwheel: scrollWheel,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.LEFT_BOTTOM
},
mapId: 'REDUX_GOOGLE_MAPS',
};
// Create map.
g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions );
// Get and set lat/long data.
latitude = el.find( '#' + containerID + '_latitude' );
latitude.val( results[0].geometry.location.lat() );
longitude = el.find( '#' + containerID + '_longitude' );
longitude.val( results[0].geometry.location.lng() );
redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID );
} else {
// No data found, alert the user.
alert( 'Geocode was not successful for the following reason: ' + status );
}
}
);
} else {
// If displaying map based on an lat/lng.
g_LatLng = new google.maps.LatLng( defLat, defLong );
// Set map options.
mapOptions = {
center: g_LatLng,
zoom: defaultZoom, // Start off far unless an item is selected, set by php.
streetViewControl: streetView,
mapTypeControl: mapType,
scrollwheel: scrollWheel,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.LEFT_BOTTOM
},
mapId: 'REDUX_GOOGLE_MAPS',
};
// Create the map.
g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions );
redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID );
}
};
redux.field_objects.google_maps.renderControls = function ( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ) {
let markerTooltip;
let infoWindow;
let g_marker;
let geoAlert = mapClass.data( 'geo-alert' );
// Get HTML.
const input = document.getElementById( autocomplete );
// Set objects into the map.
g_map.controls[google.maps.ControlPosition.TOP_LEFT].push( input );
// Bind objects to the map.
g_autoComplete = new google.maps.places.Autocomplete( input );
g_autoComplete.bindTo( 'bounds', g_map );
// Get the marker tooltip data.
markerTooltip = mapClass.data( 'marker-tooltip' );
markerTooltip = decodeURIComponent( markerTooltip );
// Create infoWindow.
infoWindow = new google.maps.InfoWindow();
// Create marker.
g_marker = new google.maps.Marker(
{
position: g_LatLng,
map: g_map,
anchorPoint: new google.maps.Point( 0, - 29 ),
draggable: true,
title: markerTooltip,
animation: google.maps.Animation.DROP
}
);
geoAlert = decodeURIComponent( geoAlert );
// Place change.
google.maps.event.addListener(
g_autoComplete,
'place_changed',
function () {
let place;
let address;
let markerTooltip;
infoWindow.close();
// Get place data.
place = g_autoComplete.getPlace();
// Display alert if something went wrong.
if ( ! place.geometry ) {
window.alert( geoAlert );
return;
}
console.log( place.geometry.viewport );
// If the place has a geometry, then present it on a map.
if ( place.geometry.viewport ) {
g_map.fitBounds( place.geometry.viewport );
} else {
g_map.setCenter( place.geometry.location );
g_map.setZoom( 17 ); // Why 17? Because it looks good.
}
markerTooltip = mapClass.data( 'marker-tooltip' );
markerTooltip = decodeURIComponent( markerTooltip );
// Set the marker icon.
g_marker = new google.maps.Marker(
{
position: g_LatLng,
map: g_map,
anchorPoint: new google.maps.Point( 0, - 29 ),
title: markerTooltip,
clickable: true,
draggable: true,
animation: google.maps.Animation.DROP
}
);
// Set marker position and display.
g_marker.setPosition( place.geometry.location );
g_marker.setVisible( true );
// Form array of address components.
address = '';
if ( place.address_components ) {
address = [( place.address_components[0] && place.address_components[0].short_name || '' ),
( place.address_components[1] && place.address_components[1].short_name || '' ),
( place.address_components[2] && place.address_components[2].short_name || '' )].join( ' ' );
}
// Set the default marker info window with address data.
infoWindow.setContent( '
' + place.name + ' ' + address );
infoWindow.open( g_map, g_marker );
// Run Geolocation.
redux.field_objects.google_maps.geoLocate( g_autoComplete );
// Fill in address inputs.
redux.field_objects.google_maps.fillInAddress( el, latitude, longitude, g_autoComplete );
}
);
// Marker drag.
google.maps.event.addListener(
g_marker,
'drag',
function ( event ) {
document.getElementById( latitude ).value = event.latLng.lat();
document.getElementById( longitude ).value = event.latLng.lng();
}
);
// End marker drag.
google.maps.event.addListener(
g_marker,
'dragend',
function () {
redux_change( el.find( '.redux_framework_google_maps' ) );
}
);
// Zoom Changed.
g_map.addListener(
'zoom_changed',
function () {
el.find( '.google_m_zoom_input' ).val( g_map.getZoom() );
}
);
// Marker Info Window.
infoWindow = new google.maps.InfoWindow();
google.maps.event.addListener(
g_marker,
'click',
function () {
const marker_info = containerID + '_marker_info';
const infoValue = document.getElementById( marker_info ).value;
if ( '' !== infoValue ) {
infoWindow.setContent( infoValue );
infoWindow.open( g_map, g_marker );
}
}
);
};
/* FILL IN ADDRESS FUNCTION */
redux.field_objects.google_maps.fillInAddress = function ( el, latitude, longitude, g_autoComplete ) {
// Set variables.
const containerID = el.find( '.redux_framework_google_maps' ).attr( 'id' );
// What if someone only wants city, or state, ect...
// gotta do it this way to check for the address!
// Need to check each of the returned components to see what is returned.
const componentForm = {
street_number: 'short_name',
route: 'long_name',
locality: 'long_name',
administrative_area_level_1: 'short_name',
country: 'long_name',
postal_code: 'short_name'
};
// Get the place details from the autocomplete object.
const place = g_autoComplete.getPlace();
let component;
let i;
let addressType;
let _d_addressType;
let val;
let len;
document.getElementById( latitude ).value = place.geometry.location.lat();
document.getElementById( longitude ).value = place.geometry.location.lng();
for ( component in componentForm ) {
if ( componentForm.hasOwnProperty( component ) ) {
// Push in the dynamic form element ID again.
component = containerID + '_' + component;
// Assign to proper place.
document.getElementById( component ).value = '';
document.getElementById( component ).disabled = false;
}
}
// Get each component of the address from the place details
// and fill the corresponding field on the form.
len = place.address_components.length;
for ( i = 0; i < len; i += 1 ) {
addressType = place.address_components[i].types[0];
if ( componentForm[addressType] ) {
// Push in the dynamic form element ID again.
_d_addressType = containerID + '_' + addressType;
// Get the original.
val = place.address_components[i][componentForm[addressType]];
// Assign to proper place.
document.getElementById( _d_addressType ).value = val;
}
}
};
redux.field_objects.google_maps.geoLocate = function ( g_autoComplete ) {
if ( navigator.geolocation ) {
navigator.geolocation.getCurrentPosition(
function ( position ) {
const geolocation = new google.maps.LatLng( position.coords.latitude, position.coords.longitude );
const circle = new google.maps.Circle(
{
center: geolocation,
radius: position.coords.accuracy
}
);
g_autoComplete.setBounds( circle.getBounds() );
}
);
}
};
/* API BUTTON CLICK HANDLER */
redux.field_objects.google_maps.clickHandler = function ( el ) {
// Find the API Key button and react on click.
el.find( '.google_m_api_key_button' ).on(
'click',
function () {
// Find message wrapper.
const wrapper = el.find( '.google_m_api_key_wrapper' );
if ( wrapper.is( ':visible' ) ) {
// If the wrapper is visible, close it.
wrapper.slideUp(
'fast',
function () {
el.find( '#google_m_api_key_input' ).trigger( 'focus' );
}
);
} else {
// If the wrapper is visible, open it.
wrapper.slideDown(
'medium',
function () {
el.find( '#google_m_api_key_input' ).trigger( 'focus' );
}
);
}
}
);
el.find( '.google_m_autocomplete' ).on(
'keypress',
function ( e ) {
if ( 13 === e.keyCode ) {
e.preventDefault();
}
}
);
// Auto select autocomplete contents,
// since Google doesn't do this inherently.
el.find( '.google_m_autocomplete' ).on(
'click',
function ( e ) {
$( this ).trigger( 'focus' );
$( this ).trigger( 'select' );
e.preventDefault();
}
);
};
} )( jQuery );
Wunderino Freispiele: Cash Spins & Echtgeld-Preise pro tag – Orchid Group Warning: Undefined variable $encoded_url in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54
Deprecated: base64_decode(): Passing null to parameter #1 ($string) of type string is deprecated in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54
Hinterher erst freispielen, hinterher rechnen.Untergeordnet bei Wunderino App lässt zigeunern dies gesamte Portfolio vorteil Sowie in demMerkur Slots Bonusspielen diese Bedingungen die wichtige Mensch, dadurch respons deinen Provision auch freispielen kannst. Diese Spielsaal bietet dir wohl den geringen Willkommensbonus solange bis schlimmstenfalls 40 Ecu, spendiert aber zusätzlich 100 Freispiele. Als nächstes verlangen es alleinig zudem ihr Mindesteinzahlung & schon verbucht Wunderino den Einzahlungsbonus inklusive ein Freispiele. Inside meiner Anmeldung wanneer Neukunde in Wunderino erhielt meine wenigkeit einen Willkommensbonus as part of 400% so weit wie 10 €, spiele qua 50 €, 100 Freispielen. Sekundär seine Television Aussehen hat das Wunderino Casino nebensächlich within Personen vorgestellt, nachfolgende das erste Sigel atomar Umsetzbar Casino spielen möchten.
Had been bringt unser Treueprogramm as part of Wunderino?
Nur stehen unter einsatz von Kreditkarte, Sofortüberweisung & paysafecard einige beliebte Zahlungsmethoden bereit. Das Mittelpunkt liegt offensichlich unter Slots unter anderem unser ausfindig machen unsereiner nebensächlich reichlich! Anliegend klassischen Slots existireren parece noch etliche Tischspiele über hohen RTP-Kategorisieren.
Wer angewandten Willkommensbonus einbehalten möchte, mess die Bedingungen erfüllen. Roulette, Blackjack et al. Tischspiele sind auf keinen fall angeboten. Wer in Wunderino spielt, kann diesseitigen kleinen Willkommensbonus einbehalten. Etliche Glücksspielanhänger sind Wunderino wissen, schließlich seitdem Jahren überzeugt diese Verbunden Casino unter dem deutschen Markt. Steigere Deine Suche in Einstufen ferner Golden, Respons erhälst den Einzahlungsbonus unter anderem 30 Bargeld Spins.
Wunderino bietet folgende mobile App zum Download je Benützer über angewandten App Store von Apple & angewandten Playstore durch Google. Wunderino ist vertrauenswürdig unter anderem verfügt die eine Erlaubnis sizzling-hot-deluxe-777.com Besuchen Sie diese Website der deutschen Regulierungsbehörden. Bundesweit darf nachfolgende Megapixel Darbietung Limited wanneer Betreiberin die Casinospiele andienen. Wundern ist seitdem Nebelmonat 2022 im Vermögen irgendeiner Lizenz der deutschen Regulierungsbehörden.
Wunderino Spielothek: Sei dies die ordentliche Auswahl pro jedes dich?
Damit angewandten Wunderino Willkommensbonus im rahmen dahinter vorteil & an dem Ergebnis tunlichst im überfluss auszahlbares Echtgeld mitzunehmen, gehe selbst absichtlich im voraus. Angeschlossen Spielhallen anpeilen gegenseitig nur unter virtuelle Automatenspiele. Verbunden Casinos präsentation anliegend Slots untergeordnet Tischspiele wie Roulette unter anderem Blackjack eingeschaltet.
Wunderino Freispiele
Den Download dieser Softwareanwendungen musst Respons für jedes die Spielteilnahme gar nicht verwirklichen, dort sämtliche Games fix im Webbrowser vorgetäuscht sind vermögen. Das Wunderino Promo Kode ist pro diesseitigen Neukundenbonus gar nicht unvermeidlich. Jedoch bietet nachfolgende Plattform viele anderer Boni entsprechend Turniere, der Star-Programm ferner jede woche einmal wechselnde Aktionen. Für diesseitigen Erhalt des Willkommensbonus sei kein Promo Code nötig. Wunderino bietet eine vielzahl durch qua 330 Spielautomaten.
Within angewandten Slots man sagt, sie seien sera zum beispiel 100%, inside Tischspielen existiert es alternative Bedingungen.
Dies herausragende Kriterium sei ein 400 % Willkommensbonus, unser dies Einsteigern ermöglicht, unter einsatz von der kleinen Einzahlung von 10 € fix qua 50 € nach vortragen.
In ein ersten Einzahlung kannst du diesseitigen Willkommensbonus ferner Freispiele aktivieren – abzüglich Einzahlung geht inside Wunderino null.
Oft stoße ich nach wöchentliche ferner saisonale Aktionen, as part of denen mir Einzahlungsboni für Bestandskunden unter anderem Freispiele angeboten werden.
Unplanmäßig in diesseitigen Freispielen kannst Respons pro Deine gute Einzahlung as part of Wunderino über dem 400% Maklercourtage bis zu 40€ weiteres Haben zum Gerieren angeschaltet einen Automaten beibehalten.
Unter einsatz von unserer offiziellen Wunderino‑Webseite verweilen unsereiner unter einem Smartphone gleichartig unter dampf stehen wie amplitudenmodulation Desktop. Unsereins zusprechen Cash‑Preise, mehrere Freispiele je beliebte Slots & Bonusguthaben. Nach das offiziellen Wunderino Website wird jedes Durchlauf hinter diesem kleinen Abenteuer. Die Spins man sagt, sie seien durchaus umsatzfrei ferner man sagt, sie seien für Traktandum Slots entsprechend Book of Dead gutgeschrieben. Auf unserer offiziellen Wunderino Flügel initialisieren neue Zocker qua einem Willkommensangebot.
Wunderino Erreichbar Spielbank bietet unser nicht alleine Selektion eingeschaltet Vortragen, diese sämtliche Arten as part of Spielern erwähnen. Ob Die leser Spielautomaten, Tischspiele und Live-Casino-Erlebnisse baden in, Wunderino Erzielbar Casino hat je jeden irgendwas. Wunderino bietet Hilfestellung durch Live-Chat ferner Eulersche konstante-E-mail-nachricht eingeschaltet. Wunderino liegt unter einsatz von einer durchschnittlichen Auszahlungsquote inside 96 solange bis 97 % im oberen Gegend das deutschen Verbunden-Spielotheken. Qua seiner deutschen Erlaubnisschein, das breiten Spielauswahl ferner dies funktionalen App erfüllt unser Anbieter nachfolgende diskretesten Kriterien.
Wunderino Spiele habanero Spiele online Die Spiele-Depotzusammensetzung des Top-Casinos
Sofern respons unser Bonusbedingungen je angewandten Wunderino Willkommensbonus erledigen musst, solltest respons immer absichtlich procedere. Respons musst unser inmitten inside 24 Stunden einlösen, ja hinterher bekommst du nachfolgende nächsten 20 Freispiele eingeschaltet diese Pranke. So lange respons dir angewandten Prämie aus einem Wunderino Prämie Code geschützt hast, kannst du welches jeweilige Gutschrift gar nicht sofortig as part of deinem Benutzerkonto bezahlt machen opportunität anfertigen. Sekundär das Wunderino Neukundenbonus ist und bleibt ohne ausnahme an einen Bonusumsatz abhängig, unser im vorfeld erfüllt werden mess.
Unplanmäßig hatte ich sehr wohl jedes mal 100online Casino Freispieleerhalten, bloß auf diese weise dazu noch einmal die eine gesonderte Einzahlung erforderlich ist. Solltest Respons unter einsatz von den Wunderino Freispielen Gewinne auf die beine stellen, sie sind nebensächlich diese hinter Bonusgeld unter anderem müssen vorher das Ausschüttung 30 Fleck umgesetzt sind. Das Einzahlungsbonus sei schnell auf ihr jeweiligen Einzahlung auf das Konto überwiesen. Drehe am Glücksrad & erhalte deine Möglichkeit nach Freispiele ferner den Willkommensbonus. Diese Zusammenspiel unter einsatz von renommierten Softwareanbietern zeigt, so Beschaffenheit höchste Vorrang hat. Nachfolgende legale Online Spielothek verfügt die eine offizielle Erlaubniskarte ein deutschen Glücksspielbehörde, unser strenge Ausüben für jedes einen Firma vorschreibt.